package com.dliu.javaleetcode;

/**
 * @author yanglei
 * @version V1.0
 * @date 2021/3/31 0:09
 */
public class LC0002Add2Number {
    /**
     给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
     请你将两个数相加，并以相同形式返回一个表示和的链表。
     你可以假设除了数字 0 之外，这两个数都不会以 0 开头。

     示例 1：
        2->4->3
        5->6->4
     输入：l1 = [2,4,3], l2 = [5,6,4]
     输出：[7,0,8]
     解释：342 + 465 = 807.
     示例 2：

     输入：l1 = [0], l2 = [0]
     输出：[0]
     示例 3：

     输入：l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
     输出：[8,9,9,9,0,0,0,1]
     */
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode result = null;
        ListNode node = null;
        int flag = 0;
        while (true){
            int temp1 = l1 != null ? l1.value : 0;
            int temp2 = l2 != null ? l2.value : 0;
            int temp = temp1 + temp2 + flag;

            if (result == null) {
                result = node = new ListNode(temp%10);
            }else {
                node.next = new ListNode(temp%10);
                node = node.next;
            }
            l1 = l1 != null ? l1.next : null;
            l2 = l2 != null ? l2.next : null;
            flag = temp/10;
            if (flag > 0){
                node.next = new ListNode(flag);
            }
            if (l1 == null && l2 == null){
                return result;
            }
        }
    }

    public static void main(String[] args) {
        ListNode l1 = new ListNode(2);
        l1.next = new ListNode(4, new ListNode(5));

        ListNode l2 = new ListNode(5);
        l2.next = new ListNode(6, new ListNode(4));
        ListNode node = LC0002Add2Number.addTwoNumbers(l1, l2);
        while (node != null){
            System.out.print(node.value);
            if (node.next != null){
                System.out.print("->");
            }
            node = node.next;
        }
        System.out.println();
    }
}

class ListNode {
    int value;
    ListNode next;
    ListNode(){}
    ListNode(int val){
        this.value = val;
    }

    ListNode(int val, ListNode next) {
        this.value = val;
        this.next = next;
    }
}
